﻿#include <iostream>
using namespace std;
#include <iomanip>
//第一题
//求矩阵元素之和
//输入一个 m×n 的二维数组，计算并输出所有元素的和。
int ArrSum(int** a,int rows,int cols)
{
	int sum = 0;
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			sum += a[i][j];
		}
	}
	return sum;
}

//第二题
//输入一个二维数组，找出其中的最大值及其在数组中的位置（行号和列号）。
void FindMax(int** a,int rows,int cols)
{
	int destrow = 0, destcol = 0;
	int mark = 0;
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			if (a[i][j] > mark)
			{
				mark = a[i][j];
				destrow = i;
				destcol = j;
			}
		}
	}
	cout << "最大的元素的行为" << destrow + 1 << " 列为" << destcol + 1 << endl;
}

//第三题
//判断是否是对称矩阵
//输入一个 n×n 的二维数组，判断该矩阵是否是对称矩阵。
bool IsSym(int** a,int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (a[i][j] != a[j][i])
				return false;
		}
	}
	return true;
}

//第四题
//旋转矩阵
//输入一个 n×n 的二维数组，将其顺时针旋转 90 度。
void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
void ArrTurn(int** a, int n)
{
	for (int i = 0; i < n; i++)
	{
		for (int j = i + 1; j < n; j++)
		{
			swap(&a[i][j], &a[j][i]);
		}
	}
	for (int i = 0; i < n; i++)
	{
		int left = 0, right = n-1;
		while (left < right)
		{
			swap(&a[i][left], &a[i][right]);
			left++;
			right--;
		}
	}
}

//第五题
//输入一个 m×n 的矩阵，如果矩阵中有大部分元素为零，将其转换为稀疏矩阵的存储形式
void SparseMatrix(int** a, int rows, int cols)
{
	cout << "Row\t" << "Col\t" << "Value" << endl;
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < rows; j++)
		{
			if (a[i][j] != 0)
			{
				cout << i << "\t" << j << "\t" << a[i][j] << endl;
			}
		}
		cout << endl;
	}
}
int main()
{
	int rows, cols;
	cout << "请输入行数与列数" << endl;
	cin >> rows >> cols;
	int** a = new int*[rows];
	for (int j = 0; j < rows; j++)
	{
		a[j] = new int[cols];
	}
	for (int k = 0; k < rows; k++)
	{
		for (int t = 0; t < cols; t++)
		{
			cout << "请输入第" << k+1 << "行" << t+1 << "列元素" << endl;
			cin >> a[k][t];
		}
	}

	//第一题测试
	cout << "元素和为" << ArrSum(a, rows, cols) << endl;
	//第二题测试
	FindMax(a, rows, cols);
	//第三题测试
	if (IsSym(a, rows))
		cout << "是对称数组" << endl;
	else
		cout << "不是对称数组" << endl;
	//第四题测试
	//ArrTurn(a, rows);
	//for (int i = 0; i < rows; i++)
	//{
	//	for (int j = 0; j < rows; j++)
	//	{
	//		cout << a[i][j] << " ";
	//	}
	//	cout << endl;
	//}
	//第五题测试
	SparseMatrix(a, rows, cols);


	//内存释放
	for (int j = 0; j < rows; j++)
	{
		delete[] a[j];
	}
	delete[] a;
	return 0;
}

//第二题
//输入一个二维数组，找出其中的最大值及其在数组中的位置（行号和列号）。
